Con
questo sistema potrete attivare o disattivare utenze domestiche
(luci, caldaie, termoventilatori...) della vostra casa da un computer,
smartphone o tablet sia da locale che da remoto.
Nelle pagini
precedenti abbiamo affrontato diversi argomenti riguardanti la scheda
Arduino collegata in rete, in particolare abbiamo imparato a comandarlo, sia da
locale che da remoto, tramite dei tasti presenti in una
pagina HTML i quali, ad ogni pressione, mandavano alto o basso un pin
corrispondente di Arduino. Qualsiasi utenza che avremmo voluto
collegare a quei pin per poterla attivare o disattivare (magari tramite dei rele')
avrebbe dovuto pero' essere nei pressi della scheda o comunque
poco distanze da essa per evitare di passare fili elettrici troppo
lunghi e un po' dappertutto. Con questo progetto non serve, le
utenze possono essere distribuite in un appartamento a discreta
distanza da Arduino perche' non occorre che siano collegate ad esso
con dei cavi in rame, infatti in questo progetto ho usato le onde
radio. Nel disegno seguente e' raffigurato uno schema a blocchi che
rappresenta il funzionamento del sistema.
Quando
nella barra degli indirizzi di un browser si immette l'indirizzo
pubblico fornitoci dal nostro provider (nel caso in cui il browser
risieda su un computer remoto) o privato della nostra Ethernet shield
(nel caso in cui il browser risieda su un computer locale), Arduino
Mega (che funge da server) rilascia una pagina HTML con dei pulsanti
(memorizzata al suo interno) che viene caricata dal browser
suddetto. Il programma usato da Arduino Mega e' molto simile a quello
utilizzato dal sistema "ARDUINO ETHERNET COMANDATO DA LOCALE" le varianti servono per farlo lavorare con i
moduli RX TX, se siete interessati all'intimo funzionamento del
software visitate la suddetta pagina, qui descrivero' solo le modifiche
apportate. La figura seguente mostra tale pagina rilasciata da Arduino Mega:
Da
questa pagina si possono comandare fino a 20 utenze (io ne ho usate
solo tre in questo lavoro), per ogni utenza va implementato un blocco
composto da un modulo RX, un Arduino Nano ed un rele'. Nella figura
sottostante i dettagli del blocco:
Per
il modulo ricevitore un'antenna costituita da uno spezzone di filo
lungo 17 cm e' sufficiente, consiglio di usare un filo di rame rigido
di quelli che si trovano un po' in tutti i ferramenta
per mantenere una polarizzazione stabile (verticale o orizzontale)
in accordo con quella del trasmettitore per avere la massima efficienza
nel collegamento. Viene ora qui di seguito descritto il programma
caricato in Arduino Nano. Prima di iniziare,.pero', vorrei far luce su
un problema al quale molto probabilmente andrete in contro
programmando, tramite l'IDE, il vostro Arduino Nano. Se l'IDE, una
volta che avrete settato la scheda sotto "Strumenti", non
vi dara' la possibilita' si cambiare la porta (scritta grigia non
cliccabile) significa che il vostro computer non ha installato il
driver giusto per la scheda in vostro possesso che molto probabilmente
e' un clone. In questo caso provate ad installate questo driver
prima di impazzire per cercare in tutto il mondo come risolvere il
problema, (se il driver non dovesse andare bene avrete da me il
benestare per impazzire :-), una volta scaricato il file cliccate su
"setup" nella cartella "CH341SER". Analizziamo il primo stralcio del programma dalla riga1 alla riga 16:
Alla prima riga troviamo l'inclusione della libreria "VirtualWire.h" per i due moduli RX e TX. Alla
seconda troviamo la dichiarazione della costante "receive_pin" che
indica il numero di pin dove e' collegata l'uscita dati del modulo
RX, potete cambiare questo pin a vostro piacimento; Alla
terza riga troviamo la dichiarazione della costante "LED13"
indicante il pin dove e' collegato il led di bordo di Arduino Nano. Alla
quarta riga troviamo la dichiarazione della costante "RELE" indicante
il pin dove e' collegato il comando (attivo alto) del rele', potete
cambiare questo pin a vostro piacimento. Alla
quinta riga troviamo
la dichiarazione di tipo char "INDIRIZZO" che indica l'indirizzo della
scheda
Arduino Nano, ogni pulsante sulla pagina HTML corrisponde ad una
lettera dell'alfabeto (Utenza 01 -> 'a', Utenza 02 -> 'b' e cosi'
via) quindi per poter indirizzare tutte e 20 le schede Arduino Nano
occorrono le lettere dell'alfabeto da 'a' a 'v', questi indirizzi sono
univoci per ogni scheda, e' bene quindi non duplicarli per errore pena
attivazione o disattivazioni contemporaneamente di due o piu' schede
con lo stesso
indirizzo. Vi conviene, ogni volta che programmate un Arduino Nano,
segnarvi su di un foglio l'indirizzo appena usato e segnarlo anche su di
un pezzettino di carta nastro da attaccare sulla scheda programmata con
quell'indirizzo. Siamo ora giunti alla funzione "void setup()". Alla
ottava e nona riga troviamo due istruzioni per settare il pin 13
(LED_13) e il pin 5 (RELE) come uscite e porle a basso livello con le
due istruzioni successive alle righe 10 e 11. Alla
riga 12 e' presente l'istruzione "delay(1000)" per ritardare di un secondo l'avanzare
del programma, questo da il tempo al modulo RX di stabilizzarsi. L'istruzione
alla 13 riga "vw_set_rx_pin(receive_pin)" setta il pin (receive_pin)
per la lettura dei dati provenienti dal modulo RX. L'istruzione alla riga 14 "vw_setup(2000)" setta la velocita' dei dati (bit/sec). L'istruzione alla riga 15 "vw_rx_start()" attiva il processo di ricezione. Prima
di proseguire e' opportuno dare una spiegazione orientativa sul
funzionamento del sistema. Abbiamo detto che ogni scheda ha un
indirizzo univoco (un byte di tipo char), questo viene spedito da
Arduino Mega tramite il modulo TX alla pressione del tasto corrispondente sulla pagina HTML assieme ad un altro
byte (sempre di tipo char come l'indirizzo) che indica lo stato che
deve avere il rele' ('1' = rele' attivato, '0' = disattivato) che e'
in accordo con il colore del tasto premuto (tasto rosso = '1',
tasto bianco = '0'). Adesso possiamo proseguire.
Alla
riga 19 c'e' la dichiarazione di un array a due elementi, nel
primo elemento (buf[0]) verra' memorizzato il
byte dell'indirizzo mentre nel secondo elemento (buf[1]) il byte
dello stato entrambi spediti, come abbiamo detto, da Arduino Mega. Nella
riga 20 c'e' la dichiarazione di una variabile che contiene il numero
dei byte che dovranno essere ricevuti, ovviamente e' pari a due. Alla
riga 21 il programma si interrompe e rimane in attesa dell'arrivo dei
dati,
appena questi sono disponibili tramite la istruzione alla riga 22
"vw_get_message(buf, &buflen)", che conosce, tramite
"&buflen", di quanti byte sono composti, vengono
letti e memorizzati nell'array visto sopra. Alla
riga 23 se l'indirizzo letto non corrisponde a quello della scheda in
questione non viene eseguito il corpo della "if"e il programma torna al
void loop() per rimettersi in attesa del prossimo dato. Se
invece l'indirizzo e' quello giusto allora il corpo viene eseguito,
all'interno di esso il programma esegue un'altra istruzione
condizionale, se nell'array "buf[1]" (elemento 1) e' presente un '1' il
programma accende il led e alimenta il rele', in caso contrario,
tramite "l'else", esegue la seconda istruzione condizionale che
controlla se ci sia un '0' sempre nell'elemento 1 dell'array, in caso
affermativo spegne il led e disalimenta rele'. L'immagine seguente visualizza il sistema ricevente reale ed in funzione.
Passiamo
ora ad analizzare il sistema trasmittente composto da un Arduino Mega
con shield Ethernet e da un modulo TX come nella figura seguente:
Per
il trasmettitore, dato che potrebbe andare in posti meno angusti
di dove potrebbe invece andare il ricevitore (magari posto dentro
una scatoletta di derivazione o di una presa), per aumentare l'energia
irradiata ho usato un dipolo con braccia lunghe 17 cm, esso offre alla
sorgente una impedenza di circa 73 ohm e quindi molto vicina a quella
di uscita del finale di potenza del trasmettitore, se poi si chiudono
le braccia per formare tra loro un angolo di 120 gradi la sua impedenza
presentata scende a 50 ohm rendendo migliore l'efficienza di emissione
con l'unico inconveniente che l'antenna diventa direttiva nel verso in
cui le braccia formano i 120 gradi.
Ora descrivero' il
programma per Arduino Mega limitatamente alle solo modifiche apportate
al programma originale come avevo anticipato all'inizio di questa
pagina.
Alla
riga 3, come per il ricevitore, e' presente l'inclusione della libreria
"VirtualWire.h" che serve per la comunicazione radio.
Alla
riga 9 c'e' la dichiarazione della costante "trasmit_pin" nella quale
e' contenuto in numero del pin dove usciranno i dati per pilotare il
modulo TX, potete cambiare questo pin a vostro piacimento. Alla riga
10 c'e' la dichiarazione della costante "trasmit_en_pin" nella
quale e' contenuto in numero del pin per il PTT nel caso usasse un
trasmettitore con l'abilitazione a trasmettere, potete cambiare questo
pin a vostro piacimento.
Alla
riga 11 e' presente la dichiarazione dell'array a due elementi dove
verra' memorizzato il byte indirizzo e il byte stato da spedire ad
Arduino Nano.
Dalla
riga 12 alla riga 31 ci sono le dichiarazioni di variabili di tipo char
che servono per memorizzare gli stati dei venti Arduino Nano, sono
inizializzate con il carattere '0' affiche' all'accensione del sistema
i rele' siano tutti diseccitati.
Alla riga 32 c'e' il prototipo della funzione che serve per trasmettere i dati ad Arduino Nano qui sotto riportata.
La
funzione prende i due argomenti e li memorizza nell'array "msg[]",
nella locazione 1 ci mette l'indirizzo e nella locazione 2 lo stato,
poi trasmette ad Arduino Nano entrambi i dati tramite la funzione alla
riga 611 (che tramite "strlen(msg)" sa quanti byte deve
trasmettere) e attende la fine della trasmissione con
l'istruzione "vw_wait_tx()".
Dalla
riga 94 alla riga 113 in void loop(), il programma trasmette
ripetutamente l'indirizzo e lo stato a tutti i 20 Arduino
Nano. Seguito ora con un esempio per descrivere il resto del
programma. Apriamo il nostro browser e clicchiamo nella barra di
indirizzi l'indirizzo locale di Arduino (se stiamo lavorando con
un computer in rete) o quello fornitoci dal nostro Internet Provider
(se stiamo lavorando con un computer in qualsiasi parte del mondo). Al
comando Arduino Mega rilascia la pagina HTML con i tasti che per il
adesso sono tutti bianchi dal momento che ancora non ne abbiamo premuto
alcuno. In queste condizioni Arduino Mega trasmette a tutti
gli Arduini Nano, in maniera continuativa, lo stato '0' ed i
rele' corrispondenti rimangono diseccitati. Premiamo ora ,ad esempio, il pulsante "Utenza 01".
Alla
pressione del pulsante verra' inviato ad Arduino Mega la seguente
stringa di caratteri "indirizzo IP/utenza1" dove indirizzo IP e' quello
pubblico o locale a seconda di dove stiamo eseguendo il comando, la
"if" del pezzo di programma sopra eseguira' il suo corpo. Se il tasto
nel momento in cui lo premiamo e' di colore bianco, ovvero il rele' ad
esso corrispondente e' diseccitato, verra' eseguito il corpo della
seconda "if" che carichera' nella variabile "stato_a" il carattere '1'
e cambiera' colore al tasto in rosso. Se invece il tasto nel momento in
cui lo premiamo e' rosso, ovvero il rele' corrispondente e' eccitato,
verra' eseguito il corpo della "else" che carichera' nella variabile
"stato_a" il carattere '0' e cambiera' il colore del tasto in bianco. Finita
questa procedura verra' spedita la pagina HTML con i colore del tasto
aggiornato al browser ed il programma tornera' a "void loop(). Verranno
quindi spediti a tutti gli indirizzi gli stati aggiornati, solo
in questo momento il rele' cambiera' di stato, ovviamente ci sono 20
gruppi simili a quelli visualizzati tra la riga 131 alla riga 145, uno
per utenza. Prima di completare la nostra indagine sul programma ci
tengo dire che la pagina HTML deve essere auto aggiornate, infatti se
non fosse così non potremmo sapere, con un semplice sguardo allo
schermo del computer, se un tasto e' stato premuto oppure no da qualche
altro host (smartphone, tablet...). Il pezzo di codice HTML che fa questa operazione e' il seguente:
Ho
impostato l'autoaggiornamento ogni 5 sec, se volete potete cambiare
questo valore, inoltre dovete sostituire l'indirizzo
"http://fabio-elettronico.ddns.net" con il vostro numero IP.
Per
finire devo ricordarvi che dovrete scegliere un numero IP locale per
Arduino Mega non utilizzato da qualche altra utenza collegata alla
vostra rete, esiste un programma chiamato ipscan, che dopo una veloce scansione vi indica quali indirizzi IP sono liberi e quali sono occupati dal sistema. Per ultimo, per far si che con il vostro indirizzo pubblico, che potete conosce da qui, sia possibile indirizzare Arduino Mega dovrete creare un canale DMZ Host nel vostro router come ho spiegato qui.